import axios from 'axios';
import { checkStatus } from './helpers/checkStatus';
import { clearEmptyParam } from './helpers/clearEmptyParam';
import router from '../router';

const successCodeList = [0];
const typeList = ['arraybuffer', 'blob'];

// axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8';

const service = axios.create({
  baseURL: window.global.apiURL,
  timeout: 15000 // 请求超时时间
  // headers: {
  // 'X-Requested-With': 'XMLHttpRequest'
  // 'content-type': 'application/json' // 设置传输类型(json)
  // }
});

// //设置默认请求头
axios.defaults.headers = {
  'X-Requested-With': 'XMLHttpRequest',
  'content-type': 'application/x-www-form-urlencoded'
  // 'content-type': 'application/json' // 设置传输类型(json)
  // 'config.headers['TOKEN'] = localStorage.getItem('aiToken');': 'multipart/form-data',
};

// request拦截器
service.interceptors.request.use(
  config => {
    if (localStorage.getItem('aiToken') && localStorage.getItem('aiToken') != 'null') {
      config.headers['TOKEN'] = localStorage.getItem('aiToken');
      config.headers['content-type'] = 'application/x-www-form-urlencoded';
    }
    // 移除params和data中空参数
    clearEmptyParam(config);
    return config;
  },
  error => {
    console.log('request-error ===>', error);
    return Promise.reject(error);
  }
);

// response 拦截器
service.interceptors.response.use(
  response => {
    const res = response.data;
    // console.log('response ===>', res);
    if (successCodeList.includes(res.code) || typeList.includes(response.config.responseType)) {
      if (typeList.includes(response.config.responseType)) {
        // 文件类型特殊处理
        return Promise.resolve(response);
      } else {
        return Promise.resolve(res);
      }
    } else {
      console.log('error', res);
      if (res.code == -2) {
        ElMessage.error(res.msg);
      }
      return Promise.reject(res);
    }
  },
  error => {
    // 主动取消请求。为了终结promise链 就是实际请求 不会走到.catch(rej=>{});这样就不会触发错误提示之类了。
    if (axios.isCancel(error)) return new Promise(() => {});

    // 根据服务器响应的错误状态码，做不同的处理
    if (error.response) return Promise.reject(checkStatus(error));

    // 请求超时
    if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
      ElMessage.error('请求超时，请稍候再试！');
      return Promise.reject('请求超时');
    }

    // 网络错误
    if (error.message.includes('Network')) {
      const message = window.navigator.onLine ? '服务端异常！' : '您断网了！';
      ElMessage.error(message);
      return Promise.reject(message);
    }

    ElMessage.error(error.message);
    return Promise.reject(error.message);
  }
);

export default service;
